package com.shenzw.common.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 占位符处理工具类
 *
 * @author shenzw
 * @date 2022/3/2 19:43
 */
public class PlaceholderUtils {

    /**
     * 处理字符串，将字符串中占位符 {variable} 替换为对应的值
     *
     * @param rawStr 待处理的字符串
     * @param key    variableName
     * @param value  variableValue
     * @return String
     */
    public static String format(String rawStr, String key, String value) {
        Map<String, String> parameter = new HashMap<>(15);
        parameter.put(key, value);
        return format(rawStr, parameter);
    }

    /**
     * 处理字符串，将字符串中占位符 {variable} 替换为parameter中的对应key的value
     * <p>
     * 占位符支持格式：{}
     * <p>
     * 例如：Hello {name} ，参数key=name,value=world,则返回：Hello world
     *
     * @param rawStr    待处理的字符串
     * @param parameter 参数
     * @return String 处理后的字符串
     */
    public static String format(String rawStr, Map<String, String> parameter) {
        if (parameter == null || parameter.isEmpty()) {
            return rawStr;
        }
        for (Map.Entry<String, String> entry : parameter.entrySet()) {
            String pat = "\\{\\s*" + entry.getKey() + "\\s*}";
            Pattern pattern = Pattern.compile(pat);
            Matcher matcher = pattern.matcher(rawStr);
            String sValue = "";
            if (entry.getValue() != null) {
                sValue = Matcher.quoteReplacement(entry.getValue());
            }
            rawStr = matcher.replaceAll(sValue);
        }
        return rawStr;
    }

    /**
     * 判断是否包含指定KEY
     *
     * @param rawStr 待处理的字符串
     * @param key    variableName
     * @return boolean
     */
    public static boolean contain(String rawStr, String key) {
        String pat = "\\{\\s*" + key + "\\s*}";
        Pattern pattern = Pattern.compile(pat);
        Matcher matcher = pattern.matcher(rawStr);
        return matcher.find();
    }

    /**
     * 判断是否包含指定KEY以及后面是否包含指定内容
     *
     * @param rawStr 待处理的字符串
     * @param key    variableName
     * @return boolean
     */
    public static boolean contain(String rawStr, String key, String afterStr) {
        String pat = "\\{\\s*" + key + "\\s*}[\\s]+" + afterStr;
        Pattern pattern = Pattern.compile(pat);
        Matcher matcher = pattern.matcher(rawStr);
        return matcher.find();
    }
}
